home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Various / S.N.A.G. Disk of the Month 91-03 (1991)(Southern Nevada Amiga Group)(PD).zip / S.N.A.G. Disk of the Month 91-03 (1991)(Southern Nevada Amiga Group)(PD).adf / PIV / PIV.c < prev    next >
C/C++ Source or Header  |  1991-03-29  |  4KB  |  144 lines

  1. /* PIV.c
  2.  *
  3.  * (c) Copyright 1991 J. Edward Hanway
  4.  * May be redistributed freely for non-commercial purposes as long
  5.  * as the copyright notice remains intact.
  6.  *
  7.  * Spiffs up the 'Please Insert volume FOO:' requester with additional
  8.  * options allowing you to assign or mount the volume.
  9.  *
  10.  * $Id: PIV.c,v 1.1 91/03/13 22:33:20 jeh Exp $
  11.  *
  12.  * $Log:    PIV.c,v $
  13.  * Revision 1.1  91/03/13  22:33:20  jeh
  14.  * Initial revision
  15.  * 
  16.  */
  17.  
  18. #include <exec/types.h>
  19. #include <libraries/dos.h>
  20. #include <intuition/intuition.h>
  21. #include <proto/exec.h>
  22. #include <proto/dos.h>
  23. #include <proto/intuition.h>
  24. #include <string.h>
  25.  
  26. #include "PIV.h"
  27.  
  28. #define LVOAutoRequest -0x015c
  29. #define SAY(s)    Write(_Backstdout, s, strlen(s))
  30.  
  31. /* stuff for SAS cback.o */
  32.  
  33. LONG  _stack      = 4000;
  34. char  *_procname  = "_PIV";
  35. LONG  priority    = 0;
  36. LONG  _BackGroundIO = 1;
  37.  
  38. extern BPTR _Backstdout;
  39.  
  40. extern long __asm call_AutoRequest(register __a0 struct Window *,
  41.                     register __a1 struct IntuiText *,
  42.                     register __a2 struct IntuiText *,
  43.                     register __a3 struct IntuiText *,
  44.                     register __d0 LONG,
  45.                     register __d1 LONG,
  46.                     register __d2 ULONG,
  47.                     register __d3 ULONG);
  48.  
  49. extern long do_req(struct Window *, char *);
  50.  
  51. APTR real_AutoRequest;
  52. BPTR nilfh;
  53.  
  54. long __asm __saveds
  55. my_AutoRequest(register __a0 struct Window *window,
  56.                register __a1 struct IntuiText *body,
  57.                register __a2 struct IntuiText *posText,
  58.                register __a3 struct IntuiText *negText,
  59.                register __d0 LONG pFlag,
  60.                register __d1 LONG nFlag,
  61.                register __d2 ULONG width,
  62.                register __d3 ULONG height)
  63. {
  64.     if(body->NextText && !strcmp(body->IText, "Please insert volume")) {
  65.         return do_req(window, body->NextText->IText); 
  66.     }
  67.       
  68.     return call_AutoRequest(window, body, posText, negText, pFlag, nFlag, width, height);
  69. }
  70.  
  71. void
  72. _tinymain(char *s)
  73. {
  74.     struct Task *other_task;
  75.     
  76.     if(_Backstdout) {
  77.         SAY("PIV 1.0 for AmigaDOS 1.3\n\xA9 1991 J. E. Hanway\nFreely redistributable for non-commercial use.\n");
  78.     }
  79.     
  80.     /* If already installed, kill the installed version and exit.
  81.      */
  82.     Forbid();
  83.     if(other_task = FindTask("*PIV")) {
  84.         Signal(other_task, SIGBREAKF_CTRL_C);
  85.     } else {
  86.         struct Task *this_task = FindTask(NULL);
  87.         this_task->tc_Node.ln_Name[0] = '*';
  88.     }
  89.     Permit();
  90.     
  91.     
  92.     if(other_task) {
  93.         SAY("Removed\n");
  94.         Close(_Backstdout);
  95.     } else {
  96.         if(IntuitionBase = OpenLibrary("intuition.library", 0L)) {
  97.             nilfh = Open("NIL:", MODE_OLDFILE);
  98.             init_semaphores();
  99.  
  100.             real_AutoRequest = SetFunction(IntuitionBase, (LONG) LVOAutoRequest, (APTR) &my_AutoRequest);
  101.  
  102.             if(_Backstdout) {
  103.                 SAY("Installed\n");
  104.                 Close(_Backstdout);
  105.             }
  106.         
  107.             /* allow "break <thistask>" to remove */
  108.             Wait(SIGBREAKF_CTRL_C);
  109.    
  110.             (void) SetFunction(IntuitionBase, (LONG) LVOAutoRequest, real_AutoRequest);
  111.  
  112.             /* If someone called AutoRequest the microsecond before we
  113.              * restored it, this should give the code time to grab the inuse
  114.              * semaphore.  (There are short windows of vulnerability at the
  115.              * beginning and end of the routine where the inuse semaphore
  116.              * may be free.)
  117.              */
  118.             Delay(2);
  119.  
  120.             /* With the function restored, no new requesters should be started,
  121.              * but some may be in progress.
  122.              *
  123.              * We must wait until the use count drops to zero before
  124.              * exiting the program.  The inuse semaphore will become
  125.              * available when no one is in the code.
  126.              */
  127.  
  128.             ObtainSemaphore(&inuse_sema);
  129.  
  130.             Delay(2);
  131.  
  132.             Close(nilfh);
  133.             CloseLibrary(IntuitionBase);
  134.  
  135.         } else {
  136.             if(_Backstdout) {
  137.                 SAY("Failed\n");
  138.                 Close(_Backstdout);
  139.             }
  140.         }
  141.     }
  142. }
  143.  
  144.